package com.blue.code.ftl;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Map;

import com.blue.code.bean.EntityBean;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;

/**
 * 处理器接口
 * 
 * @author zhengj
 * @since 1.0 2017年1月18日
 */
public interface Handler
{
	/**
	 * 处理实体
	 * 
	 * @param bean 实体
	 * @param output 输出目录
	 * @param pkg 基础包
	 * @throws Exception 异常时抛出
	 */
	void handle(EntityBean bean, String output, String pkg) throws Exception;
	
	/**
	 * 初始化 FreeMarker 模板配置
	 * 
	 * @param conf FreeMarker 配置
	 * @param ext FTL模板扩展名
	 * @throws Exception 异常时抛出
	 */
	void initConfiguration(Configuration conf, String ext) throws Exception;
	
	/**
	 * 输出文件
	 * 
	 * @param template FreeMarker模板
	 * @param root 填充内容
	 * @param output 输出目录
	 * @param pkg 子包
	 * @param clazz 类名
	 * @return 文件完整路径
	 * @throws IOException
	 * @throws TemplateException
	 */
	default String output(Template template, Map<String, Object> root, String output,
			String pkg, String clazz) throws IOException, TemplateException
	{
		String fileName = String.format("%s/%s/%s.java", output, pkg, clazz);
		File file = new File(fileName);
		File dir = file.getParentFile();
		if (!dir.exists())
			dir.mkdirs();
		
		try (PrintWriter pw = new PrintWriter(file, "UTF-8");)
		{
			template.process(root, pw);
			return fileName;
		}
	}
	
}
